package com.itmk.web.goods_category.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;

import com.itmk.web.goods.entity.Goods;
import com.itmk.web.goods.service.GoodsService;
import com.itmk.web.goods_category.entity.GoodsCategory;
import com.itmk.web.goods_category.entity.ListParm;
import com.itmk.web.goods_category.entity.SelectType;
import com.itmk.web.goods_category.service.GoodsCategoryService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/goodsCategory")
public class GoodsCategoryController {
    @Autowired
    private GoodsCategoryService goodsCategoryService;

    @Autowired
    private GoodsService goodsService;


    //    新增商品分类
    @PostMapping
    public ResultVo add(@RequestBody GoodsCategory goodsCategory) {
        if (goodsCategoryService.save(goodsCategory)) {
            return ResultUtils.success("add success");
        } else {
            return ResultUtils.error("add error");
        }
    }

    //    编辑商品分类
    @PutMapping
    public ResultVo edit(@RequestBody GoodsCategory goodsCategory) {
        if (goodsCategoryService.updateById(goodsCategory)) {
            return ResultUtils.success("edit success");
        } else {
            return ResultUtils.error("edit error");
        }
    }

    //    删除商品分类
    @DeleteMapping("/{categoryId}")
    public ResultVo del(@PathVariable("categoryId") int categoryId) {
        if (goodsCategoryService.removeById(categoryId)) {
            return ResultUtils.success("delete success");
        } else {
            return ResultUtils.error("delete error");
        }
    }

    // 获取商品分类列表
    @GetMapping("/getList")
    public ResultVo getList(ListParm pageParm) {
        // 创建查询包装器
        QueryWrapper<GoodsCategory> queryWrapper = new QueryWrapper<>();
        // 使用Lambda表达式设置查询条件，如果categoryName不为空，则按categoryName进行模糊查询
        queryWrapper.lambda().like(StringUtils.isNotEmpty(pageParm.getCategoryName()), GoodsCategory::getCategoryName, pageParm.getCategoryName()).orderByDesc(GoodsCategory::getSerialNum);
        // 创建分页对象，设置当前页和每页大小
        IPage<GoodsCategory> page = new Page<>(pageParm.getCurrentPage(), pageParm.getPageSize());
        // 执行分页查询，获取商品分类列表
        IPage<GoodsCategory> list = goodsCategoryService.page(page, queryWrapper);
        // 返回查询结果，成功时返回包含商品分类列表的ResultVo对象
        return ResultUtils.success("get list success", list);
    }

    // 小程序分类
    @GetMapping("/getSelectList")
    public ResultVo getSelectList() {
        // 创建查询包装器
        QueryWrapper<GoodsCategory> queryWrapper = new QueryWrapper<>();
        // 使用 Lambda 表达式设置查询条件：按照 serialNum 字段升序排序
        queryWrapper.lambda().orderByAsc(GoodsCategory::getSerialNum);
        List<GoodsCategory> list = goodsCategoryService.list(queryWrapper);
//        public class GoodsCategory {
//    @TableId(type= IdType.AUTO)
//    private Integer categoryId;
//    private String categoryName;
//    private Integer serialNum;
//        因为查询出来有三个字段，前端需要的格式是 list[{value, label}, {value, label}]
        // 创建一个空的 selectList，用于存储转换后的数据
        List<SelectType> selectList = new ArrayList<>();
        // 使用 Optional 处理可能的空值，避免空指针异常
        // 如果 list 为 null，则使用一个空列表代替
        Optional.ofNullable(list).orElse(new ArrayList<>()).stream().forEach(item -> {
            SelectType selectType = new SelectType();
            selectType.setLabel(item.getCategoryName());
            selectType.setValue(item.getCategoryId());
            selectList.add(selectType);
        });
        return ResultUtils.success("get list success", selectList);


    }

    //    闲置页面查询商品分类
    @GetMapping("/getCategory")
    public ResultVo getCategory() {
        QueryWrapper<GoodsCategory> query = new QueryWrapper<>();
        query.lambda().orderByAsc(GoodsCategory::getSerialNum);
        List<GoodsCategory> list = goodsCategoryService.list(query);
        return ResultUtils.success("查询成功", list);
    }

    // 获取商品分类及其商品数量
    @GetMapping("/getCategoryWithCount")
    public ResultVo getCategoryWithCount() {
        // 获取所有商品分类
        List<GoodsCategory> categories = goodsCategoryService.list();

        // 为每个分类计算商品数量
        categories.forEach(category -> {
            int count = goodsService.count(new QueryWrapper<Goods>().eq("category_id", category.getCategoryId()));
            category.setCount(count);  // 假设GoodsCategory类已经有setCount方法
        });

        return ResultUtils.success("获取分类及商品数量成功", categories);
    }

}
